===============================================================================
                         VoySpeak 2 - Client-Changelog
                          Copyright VoySpeak Systems
                            https://www.voyspeak.com
===============================================================================
   + Neue Funktion oder spürbare Verbesserung
   - Fehlerbehebung oder Entferntes
   * Änderung oder Hinweis
   ! Wichtig — bitte beachten!
===============================================================================

* Hinweis: Ältere Versionsblöcke können noch englische Historie enthalten;
  neue Einträge ab 2.10.9 werden parallel DE+EN geführt.

2.12.3:

2.12.2:
! Der Client heißt jetzt VoySpeak 2: neuer Name im ganzen Client, im Installer und in den Paketen; Webseite, Forum und alle Dienste laufen nur noch unter voyspeak.com
* Einstellungen, Identitäten, Lesezeichen, Plugins und Forum-Login werden beim ersten Start automatisch in den neuen Ordner „VoySpeak 2“ übernommen
* Interne Namen, Paketnamen und gespeicherte Einstellungs-Schlüssel auf VoySpeak umgestellt; vorhandene Einstellungen werden beim ersten Start automatisch übernommen
* Windows: das Programm heißt jetzt „VoySpeak 2.exe“; Desktop- und Startmenü-Verknüpfungen werden ersetzt, eine an die Taskleiste angeheftete Verknüpfung muss einmal neu angeheftet werden; die Windows-Firewall-Freigabe und eine in Windows eingestellte App-Audiogeräte-Zuordnung müssen einmalig neu gesetzt werden; bestehende Installationen bleiben im bisherigen Ordner
* Windows: neue App-ID; Benachrichtigungs-Einstellungen in Windows müssen ggf. einmal neu gesetzt werden
- Audio: Sprecher, die in den eigenen Channel wechseln, werden sofort angemeldet (lokale Lautstärke greift); nach einem Audio-Neustart werden nur nativ angemeldete Sprecher sauber neu verbunden
- Audio: ungültige Lautstärkewerte (NaN) können Sprecher nicht mehr stumm schalten; eine Plugin-Sperre für 3D/Spatial wird beim Stoppen oder Absturz des Plugins aufgehoben
- Audio: Push-to-Talk hebt beim Start keine Mikrofon-Stummschaltung mehr auf, solange die Lautsprecher stumm (deafen) sind
* Audio-Diagnose: Log zeigt Anmeldung und Lautstärke pro Sprecher, „rx stall“ wenn ein Sprecher redet aber nichts abgespielt wird, Plugin-Sperren und den eigenen Mute-Zustand nach dem Verbinden

2.12.1:
- Info-Panel (Kanal): Karten füllen die Breite ohne Leerspalte; doppelte Eigenschaften/Belegung entfernt; Beschreibung mit BBCode und internem Scroll für längere Texte
+ Channel-Beschreibung: eigener BrowserWindow-Editor (BBCode-Toolbar B/I/U/Farbe/[hr], Vorschau/Abbrechen/Anwenden) — folgt dem aktiven UI-Theme; öffnen über Kontextmenü „Beschreibung bearbeiten“ und Stift in „Kanal bearbeiten“ (übernimmt in das Formular); Vorschau aktualisiert die Channel-Info ohne Server-Schreiben
+ Beschreibung/BBCode: Flaggen-Emojis (🇩🇪 u. a. Regional-Indicator-Paare) als SVG-Flaggen; `[hr]` als volle Horizontallinie
+ Info-Panels (Client/Server/Kanal): offenes Panel aktualisiert sich live bei Änderungen (Beschreibung, Name, Topic, Codec, Nickname, Servername, …) — kein erneutes Anklicken nötig
- ServerQuery-Login anlegen: bei fehlender Berechtigung „b_client_query_create_own“ (Standard bei „Server Admin“ auf neuen TeaSpeak-Installationen) wird automatisch mit der eigenen Datenbank-ID über „b_client_query_create“ erneut versucht; Fehlermeldungen nennen jetzt die fehlende Berechtigung statt nur „insufficient client permissions“
- Chat-Sounds („Nachricht empfangen/gesendet“) fehlten im mitgelieferten Standard-Soundpack „speech“ („Sounddatei nicht gefunden“ bei jeder Nachricht)
+ Bildschirmübertragung: Qualitätsstufen „Text/Scharf“ (bis 1440p, 15 FPS), „Standard“ (1080p30) und „Flüssig“ (1080p60 ab 6000 kbit/s Limit, sonst 720p60); Bitrate richtet sich nach i_video_max_kbps der Servergruppe (statt fest 1,6 Mbit/s), Stufen über dem Limit sind ausgegraut und das Limit wird angezeigt
+ Video: Vollbild für Zuschauer (Knopf oder Doppelklick auf die Kachel); Pop-out-Fenster maximieren/Vollbild statt fester 1280×800
- Bildschirmübertragung/Kamera: nach Channelwechsel, Verschieben oder Channel-Kick läuft die Übertragung weiter (Server beendete sie, Anzeige blieb auf „teilt“)
- Bildschirmübertragung: „System-Audio teilen“ schaltete bei allen das eigene Mikro ab und kam nie an — vorerst deaktiviert, bis der Server Share-Audio unterstützt
- Video: Pop-out-Fenster beendet die Übertragung im Hauptfenster nicht mehr; nach Neuverbinden bleibt keine tote „teilt“-Anzeige; erneutes Ansehen eines Streams zeigt wieder Bild
- Bildschirmübertragung: ein geschlossenes Fenster wird nicht mehr still durch den ganzen Monitor ersetzt
- Video: Fehlermeldung schließen setzt keine laufende Kamera mehr zurück; Toolbar ausblenden beendet keine Übertragung mehr; schneller Quellenwechsel hinterlässt keine verwaisten Aufnahmen
- Kamera mit Hintergrund-Effekt friert bei minimiertem Fenster nicht mehr ein; Abziehen der Kamera wird erkannt; Kamera-Auswahl in einem anderen Tab friert die laufende Kamera nicht mehr ein
- Video: nach Netzwerkwechsel/Verbindungsabbruch der WebRTC-Verbindung wird automatisch neu verbunden; Zuschauen in Tab B während Teilen in Tab A wird sauber abgelehnt; Stop während „Verbinde…“ hinterlässt keinen hängenden Stream; beendete Übertragungen bleiben nicht als Geister stehen

2.12.0:
- Antiflood: vor jedem Datei-/Icon-Download kein diagnostisches `ftgetfileinfo`
  mehr (bis zu 2 Extra-Befehle pro FT) — wie oldclient nur noch `ftinitdownload`;
  doppelte Slash-/Bare-Pfadversuche nur wenn die Pfade wirklich unterschiedlich sind

2.11.9:
- Verbinden: unerreichbare / stumme Hosts scheitern nach ~15s (Markus-UDP-INIT)
  statt erst nach langem Hängen; Trennen/Abbruch während des Verbindens gibt
  die UI wieder frei (Tabs, Beenden)
- Verbinden: ein expliziter Port (z. B. ts.greenteaspeak.de:9988) wird beim
  ersten Versuch nicht mehr durch DNS-SRV / Standard 9987 ersetzt; Connect-URLs
  mit ?port= behalten diesen Port; Systemlog zeigt das echte Ziel host:port
- Bildschirmfreigabe: Mikrofon-TX bleibt während des Streams aktiv (mit und ohne
  Stream-Audio). Ungenutzte RTC-Audio-Leitungen bleiben recvonly;
  `broadcastaudio ssrc=0` wird bei Video-only-Stop nicht mehr gespammt; native
  Aufnahme + Wiedergabe werden nach Desktop-Capture hart neu gebunden (längere
  Chromium-Settle-Retries)
- Bildschirmfreigabe ohne Stream-Audio: Beim Ansehen werden Chromiums stumme
  Placeholder-RTC-Audiotracks nicht mehr abgespielt (die hatten native Stimme
  geduckt) — Peers bleiben hörbar während jemand video-only streamt; echtes
  Loopback spielt weiterhin nach Unmute
+ Aufnahme: Clients mit aktiver Aufnahme erscheinen im Channelbaum (und Info-
  Panel) rot mit dem TeamSpeak-Tag `[*AUFNAHME*]` (EN: `[*RECORDING*]`) —
  gesteuert über `client_is_recording`
+ UI-Sprachen: Persisch (Farsi, fa), Russisch (ru, vervollständigt) und
  Belarussisch (be) wählbar unter Einstellungen → Sprache; Persisch aktiviert
  Dokument-RTL (dir=rtl). Sprachpakete maschinell übersetzt / nutzbar —
  nicht human-reviewed.

2.11.8:
- Talk-Lämpchen: Anzeige bleibt nicht mehr kleben/flackert nicht mehr nach
  Mute/Deafen, Channel-Wechsel oder BUFFERING-Paket-Kämpfen (Windows) —
  nur Markus PLAYING|STOPPING; Sticky wird gelöscht wenn Peers den Channel
  verlassen oder man deafened; Packet-Hints nur auf dem Voice-Bind-Tab
- Favoriten: Leerzeichen im Namen (und anderen Feldern) lassen sich wieder tippen
  — verbunden und getrennt; Renderer-PTT und der native Space-Hook greifen nicht
  mehr während Tippen / offenem Favoriten-Dialog
- Favoriten-Verwaltung: lange Listen scrollen wieder, untere Einträge bleiben
  erreichbar/editierbar
- Forum-Multilogin: Login sendet eine Installations-Device-ID; Renew löscht eine
  noch gültige lokale Sitzung nicht mehr, wenn der Auth-Key abgelehnt wird
  (mehrere PCs gleichzeitig)

2.11.7:
- ServerQuery: Erstellen funktioniert wieder — Benutzername eingeben; Passwort
  wird vom Server erzeugt und einmalig (kopierbar) angezeigt. Wie TeaSpeak/
  oldclient `querycreate` / `notifyquerycreated` (kein `window.prompt` in Electron).

2.11.6:
- Kamera- und Bildschirmfreigabe funktionieren im gepackten Windows-Client wieder
  (Electron 44). Die Production-UI kommt über privilegiertes `gts-app://` (wie
  oldclient `shared-ui://`) statt `file://` aus dem asar — Vite/`npm start` nutzte
  bereits http://localhost und blieb ok. Session-Permissions erlauben zusätzlich
  `mediaKeySystem` / `speaker-selection` und loggen Ablehnungen; Fehler im
  display-media-Handler werden geloggt.
* CI: Windows Azure Trusted Signing bricht den Job hart ab bei Auth-/Dlib-/Sign-
  Fehlern (kein Soft-UNSIGNED-Publish). Angeglichen an CitexNode Desktop
  `E:\build-win.yml`; Emergency only: `GTS2_SKIP_WINDOWS_SIGNING` /
  `AZURE_SIGNING_ALLOW_UNSIGNED` (nie im CI setzen)

2.11.5:
+ Chat: Offline-/verlassene Clients lassen sich im Namens-Kontextmenü bannen (und entbannen, wenn ein Ban existiert) — per Unique ID wie bei TeamSpeak (`banadd` / `bandel`), ohne live Client-ID
+ Schwache CPUs / Voice: native Encode-/Decode-/UDP-/miniaudio-/DirectSound-Threads mit MMCSS Pro Audio + höchster Priorität (Encode-Worker matchten nie „en/decode“); UDP SO_RCVBUF/SO_SNDBUF 512KiB; klarere [voice-tx]- vs. [voice-rx]-Drop-Logs; Prozesspriorität auch unter Linux; siehe packages/native-bridge/VOICE-PERF.md (in neu gebautem teaclient_connection Win+Linux ABI 149 enthalten)
- Channel-Dateien: Download/Löschen/Umbenennen bei Namen mit `&`/Leerzeichen wie im Altclient — `send_command("ftinitdownload", { path, name, cid, cpw, clientftfid, seekpos:0, proto:1 })` mit literalem `&` auf dem Wire (`name=…Tati\s&\sLars…`, leeres `cpw` ohne `=`). TeaSpeak-`query::escape` mappt `&` nicht auf `\a`; `\a` wird zu BEL und dann Leerzeichen → 2051. Kein vorgebautes honeybbq/`\a`-Wire mehr; `[ft]` zeigt das native Wire; Listen-BEL weiter zu `&` für die UI; notifyfilelist-Mehrfach-Bulks erben path/cid von der ersten Zeile (keine abgeschnittenen/falschen Pfade in Folgebulks)
2.11.4:
* CI: Windows-Portable-Packaging stirbt auf dem Gitea-act_runner nicht mehr
  mitten in 7z (publish never, store-Kompression, Heartbeats, längeres Job-Timeout)

2.11.3:
- Bildschirmfreigabe: Stream-Audio aus (oder Video-only-Start) lässt das Mikrofon
  nicht mehr stumm. Loopback wird vollständig abgekoppelt (nicht nur stumm auf
  sendrecv), ungenutzte RTC-Audio-Leitungen bleiben recvonly, und die native
  Mikrofon-Aufnahme (inkl. RNNoise-JS-TX) wird nach dem Chromium-Desktop-Capture
  hart neu gebunden — mit verzögerten Retries
+ Erweiterungs-Katalog: Vorschau-Bilder von Plugins/Themes/Soundpacks von der API
  werden auf der Festplatte zwischengespeichert (userData/cache/catalog-images)
  und über gts-catalog-img:// ausgeliefert — Online öffnen lädt Thumbs nicht mehr
  jedes Mal neu; URL-Wechsel oder wöchentliche ETag-Prüfung aktualisiert veraltete
  Dateien
+ Themen: aktives UI-Theme deaktivieren (Header „Deaktivieren“ und Zeilen-Toggle)
  und zum eingebauten Standard-Design zurückkehren
+ Chat: Namen in Server-/Channel-/Privat-Zeilen (Join/Poke/Autoren) sind anklickbar
  und öffnen dasselbe Client-Kontextmenü wie Rechtsklick im Channelbaum; offline/
  bereits getrennte Clients öffnen weiter ein UID-Menü (Chat, Nick/UID kopieren,
  Freund/Block, Kontakte)
- Chat ist wieder pro Server-Tab getrennt (wie oldclient handlerId-Conversations);
  Tab-Wechsel mischt keine Verläufe mehr, und Channel-Nachrichten landen nicht
  mehr durch Race-Conditions in einem offenen Privat-Chat
+ Einrichtungs-Assistent beim ersten Start (Nickname, optional myGreenTeaSpeak-
  Login, Mikrofon und Lautsprecher) — einmalig auf einer frischen Installation,
  analog zum klassischen Client
+ Platzhalter-Nicknames („Another GreenTeaSpeak user“, „Standard Identität“ /
  „Standart Identität“ und ähnliche Defaults) fragen vor dem Verbinden nach einem
  echten Nick; auch wenn die Standard-Identität noch aktiv ist

2.11.2:
+ Aufnahme: einstellbare ausgehende Rauschunterdrückung (RNNoise WASM) mit eigenem
  Stärke-Slider unter Einstellungen -> Aufnahme -> Digitale Signalverarbeitung;
  0% = aus, höhere Werte = stärkeres Denoising (Tastatur/Lüfter). Native TeaSpeak-
  RNNoise-apply_config bleibt deaktiviert (Crash in diesem Build)
+ Channel-Info-Panel zeigt die numerische Channel-ID (cid); Klick zum Kopieren
+ UI-Themen: neutrale Standard-UI-Vorlage (resources/themes/_user_template) mit
  vollständiger CSS-Variablen-Abdeckung und dokumentierten Selektoren für Hauptansicht,
  Favoriten, Einstellungen, Identitäten, Dialoge, Menüs und Nebenfenster - Kopie über
  Erweiterungen -> Themen -> "Aus Vorlage anlegen..."
* UI-Themen: Favoriten, Whisper-Listen, Kontakte, Profile, Poke, Server-/Channel-
  Bearbeitung und Rechte-Dialoge erben --settings-*-Tokens; eine Palette stylt diese
  Flächen mit; Modals und Channelbaum-Popout nutzen themebare CSS-Variablen
* Runtime: Electron auf 44.5.1 aktualisiert (Chromium 152, Node 24, ABI 149);
  electron-builder 26.x; URL-Vorschau nutzt WebContentsView. Windows-TeaSpeak-
  Natives müssen für ABI 149 neu gebaut werden (npm run rebuild-natives:clean),
  bevor Voice funktioniert
- Bildschirmfreigabe ohne System-Audio lässt das Mikrofon danach nicht mehr stumm:
  die ungenutzte Screen-Audio-RTC-Leitung bleibt recvonly (kein konkurrierender
  Chromium-Capture), TeaSpeak `broadcastaudio ssrc=0` wird bei Video-only-Start
  nicht mehr gesendet, und die native Mikrofon-Aufnahme/TX wird nach Start/Stopp/
  Cleanup der Freigabe neu gebunden
- Mikrofon: Verbinden in einem neuen Server-Tab beansprucht das Mikro auf dem neuen
  Tab und stummschaltet den/die anderen Tab(s); Toolbar-Mute aktualisiert sofort;
  Aufheben der Stummschaltung beansprucht weiter exklusiv das Mikro (andere Tabs stumm)
* Start: kein Marken-Bootsplash — Hauptfenster bleibt bis ready-to-show verborgen
  und nutzt den App-Hintergrund (#1f2329), damit der Kaltstart direkt die Client-
  Oberfläche zeigt statt Schwarz → Splash → UI. Das Boot-Gate wartet weiter auf die
  Preload-Bridge, ohne Hauptfenster-Hooks früh zu mounten; „API nicht verfügbar“
  erst nach Timeout (reine Browser-Web-UI / Fehlkonfiguration)

2.11.1:
+ Soft-3D: Ein Plugin kann räumlichen Sound wieder einschalten. Leute innerhalb
  der Sprachreichweite sind hörbar, Leute außerhalb oder ohne Position werden lokal
  stummgeschaltet. Die eigene Client-Lautstärke bleibt erhalten. Solange das Plugin
  3D steuert, ist der Punkt im Extras-Menü aktiv und das 3D-Raster gesperrt
- Datei-Browser, virtuelle Server-Verwaltung und Channel-Bearbeitung bleiben an dem
  Server-Tab, von dem sie geöffnet wurden. Der sichtbare Tab kann wechseln, ohne dass
  Speichern oder die Channel-Liste auf den anderen Server springen. Ist der Tab weg,
  schließt sich das Fenster
+ Plugins können Channel-Wechsel, Nickname, Stummschalten anderer Nutzer und den
  Verbindungsstatus auch auf einem Server-Tab im Hintergrund ausführen. Ohne
  connectionId gilt weiter der gerade offene Tab

2.11.0:
- Channelbaum: lokal stummgeschaltete User zeigen das TeamSpeak-Symbol
  (durchgestrichenes Mikro), solange die lokale Stummschaltung aktiv ist
+ Plugin-SDK: connection.getState() liefert jetzt Nickname und aktuellen Channel
  (ch-ID) des lokalen Users, damit ein Plugin beides speichern und später
  wiederherstellen kann

2.10.9:
- Obere Toolbar: Aktions-Icons (Mikrofon, Lautsprecher, Aufnahme, Abonnieren, Abwesend,
  Bildschirmfreigabe, Host-Button) von 16 auf 18 px vergrößert — besser lesbar, Button-
  Hitbox unverändert
- Einladungs-/Connect-Links (gts2server://, ts3server://): ein „+“ im Token/Passwort
  wurde beim Parsen zu einem Leerzeichen (und ein führendes „+“ ganz verschluckt),
  sodass Base64-Werte wie „+cH9…“ kaputtgingen und der Beitritt scheiterte — „+“
  bleibt jetzt erhalten
- Mikrofon-Stottern bei hoher CPU-Last: solange eine Sprachverbindung besteht, hebt der
  Client jetzt seine Prozess-Priorität auf „über normal“ an und hält einen App-Suspendier-
  Blocker — so halten die nativen WASAPI-Aufnahme- und Opus-Encode-Threads ihre Deadlines
  ein und der ausgehende Stream bricht bei ausgelastetem PC nicht mehr ab
- Mikrofon-Stottern (nativer Fix): der WASAPI-Aufnahme-Thread und die Opus-Encode-/
  Decode-Worker melden sich jetzt per MMCSS „Pro Audio“ an (wie bisher schon der
  Wiedergabe-Thread), damit das Betriebssystem ihnen auch bei Volllast rechtzeitig
  CPU gibt — Opus-Encode läuft bereits entkoppelt vom Echtzeit-Capture-Callback
  (eigene en/decode-Event-Loop). Erfordert einen Neubau von teaclient_connection.node.
+ Windows-Release: MSI-Installer GreenTeaSpeak2-Setup-{version}.msi zusätzlich zum
  NSIS-Setup.exe (electron-builder-Target + Upload nach client2/windows/{version}b/)
+ Windows-Code-Signing: Setup.exe, MSI, Portable und die Haupt-EXE werden jetzt über
  Azure Trusted Signing (signtool + Azure.CodeSigning.Dlib.dll) als Post-Build-Schritt
  signiert; ohne Signing-Secrets wird mit Warnung übersprungen (Build läuft trotzdem)
* Windows-CI: Build-Workspace von C:\\gts2 nach E:\\gts2 verschoben (electron-builder-
  Cache nach E:\\ebcache) auf citexnode-win-runner — weiterhin kurzer Pfad für NSIS StdUtils
+ Changelogs: plattformweise Dateien unter github/changelog/ (windows.de.txt / windows.en.txt);
  What's New wählt Windows + UI-Sprache (Deutsch → .de, sonst .en)
+ UI-Themen: bearbeitbare User-Vorlage (resources/themes/_user_template) mit theme.css /
  theme.json; Einstellungen → Erweiterungen → Themen → „Aus Vorlage anlegen…“ kopiert
  sie nach userData/themes, aktiviert sie und öffnet den Ordner zum Bearbeiten
* UI-Themen: mitgelieferte User-Vorlage ist jetzt ein LCARS-Theme (schwarzer Void,
  Peach/Cyan/Teal/Gold/Lavender, flache CSS-Variablen)
+ Aufnahme: Start/Stopp der WAV-Aufnahme spielt jetzt einen Soundpack-Hinweis
  (recording.started / recording.stopped); der eigene Aufnahmestatus wird über
  client_is_recording gesendet, sodass alle im Channel „Aufnahme gestartet/beendet“
  hören und sehen, sobald der Server das Flag weiterleitet (TeamSpeak-artige Meldung)


2.10.8:
- Crash-Reporter: Electron-/EXE-Pfade im nativen Crash-Callback quoten, damit
  Installations- oder Repo-Pfade mit Leerzeichen (z. B. "GreenTeaSpeak 2", "GTS2 Client")
  die Crash-UI nach einem Dump wirklich starten
* Windows-CI: Gitea build-win + upload-win (SFTP client2/windows/{version}b,
  FTP updates.windows.json platform=win32); CI überspringt SemVer-Bump wie unter Linux
* Windows-CI: build-win runs-on windows-11 (citexnode-win-runner-Labels sind
  windows-10 / windows-11 — nicht windows-latest); Upload bleibt ubuntu-24.04
* Windows-CI: shell-only build-win auf citexnode-win-runner unter C:\\gts2 (vermeidet
  zu lange SYSTEM-act-Pfade, die NSIS StdUtils.nsh brechen); Upload SFTP/FTP aus dem
  Windows-Job nach client2/windows/{version}b/

2.10.7:
- Updater: Version.isDevelopmentVersion() wiederhergestellt (entfernt durch SemVer-first-
  Compare) — ohne sie warf refreshUpdaterStatus und die UI blieb bei
  "Checking…" / "Wird geprüft…" hängen (kein Aktualitäts-/Fehler-/Update-Status)
* Updater: kompletten Update-Check-Pfad absichern, damit unerwartete Fehler und API-
  Timeouts den "checking"-Zustand immer mit klarer Fehlermeldung verlassen
* Updater-UI: wenn refresh-IPC ohne onStatus rejected, Fehler zeigen statt endlosem
  Prüfen; deutscher Aktualitäts-Titel → "Client ist aktuell"
- Updater: SemVer ist maßgeblich — gleiches X.Y.Z bietet kein Update mehr an, wenn der
  lokale Build-Timestamp bereits >= remote ist (Timestamp nur bei Same-SemVer-Rebuilds;
  nie SemVer-Downgrade über neueren Stempel erzwingen)
- Linux/Windows folder-update: app-info.json + ChangeLog.txt immer in Install-Root und
  resources/ syncen, damit der nächste Check zum ausgelieferten Paket passt
* loadAppInfo: auch resources/app-info.json lesen (deb/extraResources); neuesten Kandidaten
  wählen, damit ein veralteter Root-Stempel nach erfolgreichem Update nicht erneut fragt
* Linux/Windows Release-Skripte + electron-builder extraResources: app-info.json und
  ChangeLog.txt neben dem asar ausliefern (nicht nur darin)

2.10.6:
* Elevation prompt copy: mention /opt and polkit (not Windows-only wording)

2.10.5:
- Linux updater: accept linux-unpacked/greenteaspeak2 (and AppImage) packages instead of requiring Windows Setup.exe; apply folder-update via in-place copy after quit
* Repo: gitignore local `secrets` file (never commit upload credentials)

2.10.4:
- Soundpack download: extract ZIP/.ts3_soundpack via unzip (GNU tar cannot open ZIP —
  "Das sieht nicht wie ein tar-Archiv aus"); reject HTML error pages
- Multi-tab voice: keep native playback bind on a connected tab while a new tab
  is still connecting; rewarm VoiceClients after attach/rebind (fixes dead output
  on new-tab connect); exclusive mic mute on other tabs when an additional unmuted
  tab is spawned
* .gitignore: keep native/build/linux_x64 (and win32_x64) explicitly tracked
- Linux CI: dist-linux-docker no longer auto-mounts/probes a Windows teaspeak-bundle
- Connect: clientupdate client_platform follows host OS (Linux/macOS/Windows)
  instead of always announcing Windows
* gts2 API: beta/nightly download URLs use release-{arch}.tar.gz (same deploy
  archive name as Windows; channel = version-folder suffix b/n)
* Runtime: logs expected NODE_MODULE_VERSION on native load failure

2.10.3:
- Video: camera/screen broadcast keeps running on the server where it was
  started when switching connection tabs — TX is bound to the owner
  connection (not UI focus); toolbar shows sharing only on that tab
* Settings: rename Forum nav to myGreenteaspeak and move it to the top of
  General (Allgemein); remove empty Identity section
* Settings: myGreenteaspeak page title/copy (was Forumverbindung); show
  account email on the connected card when the forum API provides it; use
  the GTS2 app icon for the myGreenteaspeak nav entry

2.10.2:
- Audio: headset / default-device hotplug — soft-rebind capture+playback when
  WASAPI devices disappear or return (no full app restart); capture health
  pokes start() so stream_invalid recovers while send stays enabled
- Talk lamps: peer indicators stay off while BUFFERING|STOPPED; packet hints
  no longer refresh BUFFERING into a Dauerlampe; callback_playback only lights
  when already audible (PLAYING|STOPPING)

2.10.1:
- Away: status no longer clears when switching connection tabs — each tab keeps
  its own away flag/message; toolbar Away follows the focused tab; All servers
  applies to every open connection
- Video: watching another client's camera/screen while your own camera is on
  works again — Markus-style extra recvonly video m-lines, canvas fallback
  SSRCs on camera/screen slots, local ICE buffered until the remote
  description is set, and soft-ignore of UnknownMediaChannel (1792) ICE races
- Channel video: hide own broadcast from the remote watch list (local preview
  only), matching Markus LocalClientEntry filtering
- Video watch: stop leave+rtcsessionreset loop — trailing empty
  notifybroadcastvideo rows no longer wipe the channel list mid-watch; UI
  debounces vanish; no double leave/reset (fixes ICE Unauthorized / bad
  local username storm after join)
- Poke (Anstupser): multi-poke received window — card rows with avatar
  initials, clearer nick/time/message hierarchy; scrollbar only when needed
- Poke (Anstupser): stay above the main window when the client is already in
  the foreground (owned/modal child + AOT; no flash-main race before show)
- Screen share: system/desktop audio actually reaches peers — after loopback
  capture, send TeaSpeak `broadcastaudio` with the audio SSRC (Markus path);
  prior fix attached the track locally but never started the channel broadcast
- Screen share: capture video via chromeMediaSourceId and loopback via a
  separate getDisplayMedia grant (Windows window+loopback was silent/empty)
+ Icons: flood/antiflood throttle plus quieter connect (fewer icon storms)
+ Talk status: Markus-aligned peer indicators (PLAYING|STOPPING); PTT
  send-enable so local talk lamp matches actual TX
+ Voice: multi-tab exclusive TX — unmute claims one speak tab; UI focus may
  stay on another muted tab (Markus-style work Tab1 / speak Tab2)
+ Audio: playback amplifier setting for louder remote voice
+ Server admin: Alle Clients list; Ban list CRUD; Nachrichten presets
  (away / kick / ban texts)
+ UI: modern kick/ban dialogs with ban preset picker
+ Connection: middle-click connection info; notifyconnectioninfo wait fix
+ Channel tree: moderated-channel icon (client-moderated with M badge)
- Client hang: softer command-path probe (less aggressive whoami recovery)
- News ticker: soft-fail so a bad feed no longer blocks the UI
- CSS: global.css truncation fix (styles no longer cut off mid-rule)

2.10.0:
* Initial 2.10.x line after 2.9.9 carry; release notes continued under 2.10.1

2.9.9:
* Release skipped in semver sequence (patch max 9 carried 2.9.9 → 2.10.0);
  notes shipped under 2.10.0 / 2.10.1

2.9.8:
- Voice: rebuild Opus without OPUS_X86_PRESUME_SSE4_1 (RTCD only) and bypass
  WebRTC AudioProcessing::ProcessStream on capture — fixes remaining
  STATUS_ILLEGAL_INSTRUCTION (0xC000001D) on talk after 2.9.7 AGC-off path
  (repro: Opened WASAPI capture → encode queue → crash in teaclient_connection)

2.9.7:
- Voice: fix main-process crash when starting to talk (STATUS_ILLEGAL_INSTRUCTION
  0xC000001D in teaclient_connection) — stop applying FixedDigital WebRTC capture
  AGC; disable AGC/AEC/NS/VAD on capture so SSE4.1 process paths are not forced
  on CPUs that abort there (repro: PTT/unmute → Opened WASAPI capture → crash)
- Channel tree: multi-select / multi-move hold-key works again with side-specific
  bindings (Alt Links / Strg Links) — captureBinding stored altleft/ctrlleft but
  the matcher only accepted bare alt/ctrl; also ignore Dead-key mis-captures

2.9.6:
+ Plugins: Tools menu lists installed UI plugins; Soundboard plugin sends WAV
  clips into the voice channel (mic TX mix, local monitor, hotkeys)
+ Channel tree: drag-and-drop channel reorder/move with server sync
+ Talk status: multi-user talk lamps stay reliable (voice-packet activity +
  sticky talk-indicator watchdog)
+ File browser: download/rename/delete, drag-and-drop upload, multi-select,
  progress, and dedicated Electron window
- Audio: Opus corrupted-stream / whisper UID handling; clearer outbound mic
  (capture DSP + higher Opus send bitrate)
+ Icons: country flags in the client tree/info panel from local SVG map
+ UI: TeamSpeak-style brand watermark in the info panel and chat log

2.9.5:
+ Crash dialog: optional upload of minidump plus the last two client logs to
  https://greenteaspeak.de/bug-report (multipart form; best-effort, no secrets)
* Natives: Electron 33 ABI 130 rebuild includes VoiceClient force_replay UAF
  fix (ACCESS_VIOLATION on duplicate stop / stream-timeout packets)

2.9.4:
+ Icons: server group menu icons load via MenuIconLoader with SHA1 disk cache
  (faster reopen, fewer duplicate downloads)
+ Audio: WAV recording of mic + remote mix for local capture/review
- Settings: crash-safe prefs — atomic JSON writes (temp+rename) plus .bak
  restore so a mid-write crash no longer resets audio devices / identities /
  bookmarks to defaults; corrupt files are quarantined, never wiped silently
- Talk lamps: packet-primary hang no longer leaves peer lamps stuck on
- Connection: command-path recovery — whoami probe before connection-lost;
  getconnectioninfo / clientmove timeouts handled without false disconnects
- Audio: Opus corrupted-stream / whisper UID fix; native log rate-limit for
  spammy decode errors
- Voice: fix main-process crash (ACCESS_VIOLATION in teaclient_connection) when
  an old/duplicate stop or stream-timeout packet deleted a buffer still held by
  force_replay — clear force_replay before delete
* Natives: Electron 33 ABI 130 (teaclient_*.node) required for GTS2

2.9.3:
- Update: refuse GTS1 / legacy packages on the GTS2 API (GreenTeaSpeak1-Setup,
  GTS1 - Legacy.exe, app-info major≠2) so a wrong deploy cannot overwrite GTS2
- Update: only accept GreenTeaSpeak2-Setup-*.exe / GreenTeaSpeak 2.exe as
  installers; release build verifies GTS2 naming in dist/windows + tar.gz

2.9.2:
- Talk status: multi-user talk lamps stay reliable via voice-packet activity
  plus a sticky talk-indicator watchdog (peers no longer stick on/off incorrectly)
- Audio: clearer outbound mic (less woolly/muffled) — capture DSP policy
  (FixedDigital AGC; AEC/HPF/AGC2 off) and Opus send bitrate 96 kbps
- Icons: after upload, cache put / forget disk so tree badges refresh without
  a stale HTTP/icon cache hit
* Natives: teaclient_*.node must be built for Electron 33 (ABI 130); wrong ABI
  yields "Module did not self-register" under GTS2

2.9.1:
- Audio: mic not sending after reconnect — detach/rebind capture and force
  send-state sync so transmit resumes after reconnect
+ Settings: custom disconnect/quit message
- Update: pass /allusers|/currentuser to Setup; re-stamp shortcut AppUserModelID
- Settings: do not overwrite saved mic/headphones when native audio falls back
  to default after update; pin userData to `%APPDATA%\GreenTeaSpeak 2` (migrate
  legacy `greenteaclient` folder if present)
- Update: keep existing install scope (all-users vs current-user) so Windows
  taskbar pins survive NSIS updates (no UninstAppUserModelId on KeepShortcuts)

2.9.0:
- Audio: idle mic capture watchdog — WASAPI/miniaudio capture can stop after
  long silence; auto-restart capture while send remains enabled

2.8.9:
- Away: status and message persist after the idle timeout fires (no longer
  cleared when the away timer expires)
- Away: enabling Away mutes the microphone; unmute is blocked while Away is
  active so the client cannot send audio in Away state
- Info panel: fall back to server info when channel details are unavailable
- Talk lamp: sticky own-client talk indicator watchdog so the lamp cannot
  remain stuck on after send stops

2.8.8:
- Audio: Chromium getUserMedia mic/echo tests disable autoGainControl so they
  cannot rewrite the Windows microphone mixer level
- Audio: device remapping no longer strips "(Brand …)" from labels — fixes
  false WASAPI remaps (e.g. RODECaster Chat→Main, Realtek→RODECaster) that
  caused quiet send and "no remote sound" on the wrong output
- Logging: filter native playback-state / fadeout spam; support logs keep
  device/volume/error lines; connection channel moves stay UI-only
- Audio: stop WebRTC AdaptiveAnalog AGC from driving Windows mic endpoint volume
  (mixer drops like 78%→56%); force fixed-digital / app-internal gain only

2.8.7:
+ Screen share: optional system audio (Windows/Linux loopback) with the share —
  Discord-like default toggle; camera share never includes it
+ Screen share: switch window/screen mid-session via replaceTrack without full
  hangup (toolbar / Change opens picker; Stop stays on the preview)
+ Screen share: enable/disable share audio while broadcasting; viewers can
  mute/unmute remote share audio independently (autoplay stays muted until unmute)
- Talk lamp: own client indicator in the channel tree follows mic send again
  (continuous / PTT / VAD); uses configured Talk-Lämpchen color
- Talk lamp: switching continuous↔VAD while unmuted no longer leaves the own
  lamp dark or stuck on; device/audio restart no longer clears it after restore
- Talk lamp: server mute/talking echoes no longer overwrite the local own-client
  talk/mute state
- Tray: while talking the notification-area icon is replaced by a TeamSpeak-style
  talk-lamp orb (Talk-Lämpchen color); normal logo when idle, gray when
  muted/deafened; tooltip includes Talking / muted / deafened

2.8.6:
- Permissions: send permvalue as signed int32 (oldclient `value | 0`) so setting
  a server/channel group icon (i_icon_id CRC32 > 2^31-1) no longer kicks with
  "Invalid argument (failed to parse permvalue as i (stoi))"
- Permissions: after creating or renaming a server/channel group, refresh the
  open permission editor group list immediately (no close/reopen)
- Camera/video UX: remote watch tiles stay muted for Chromium autoplay (no more
  black preview); failed Watch leaves the server broadcast again (no orphan join)
- Camera/video UX: channel bar grid shows only streams you watch (chips still
  discover everyone); clearer empty hint instead of idle black tiles
- Camera share: live mirrored picker preview; denied/busy/missing camera errors
  instead of “no camera”; stop orphan tracks on start failure / unmount / disconnect

2.8.5:
* Build for updater verification (no functional changes)

2.8.4:
- Updater: log real Start-Process / spawn errors to the client log file
- i18n: updateInstallerStartFailed / updateInstallerMissing use real newlines
  (no literal \n in the error dialog)
- Updater: launch NSIS Setup with elevated ShellExecute (PowerShell -Verb RunAs)
  so UAC appears after 2.8.3 RequestExecutionLevel admin; plain spawn failed

2.8.3:
- Setup finish/update relaunch now uses ExecShellAsUser so an elevated installer
  cannot spawn GreenTeaSpeak 2.exe as administrator (false "UAC at client start")
! Client never prompts UAC at start; only Setup (NSIS installer) elevates
* Windows client EXE locked to asInvoker (build.win.requestedExecutionLevel);
  portable stays requestExecutionLevel=user — no requireAdministrator on the app
* Installer UAC ≠ Client UAC: allowElevation remains on Setup only; normal
  double-click of GreenTeaSpeak 2.exe / shortcuts must not request admin
* Setup always prompts UAC at start (RequestExecutionLevel admin via customHeader)
  for any install scope; assisted UI still offers current-user vs all-users

2.8.2:
- UAC: administrator prompt belongs on NSIS Setup only (install/update overwrite),
  not on GreenTeaSpeak 2.exe at every start — revert 2.8.1 client elevation
* Client runs as normal user again (asInvoker); Setup still elevates via
  allowElevation when the install directory requires it

2.8.1:
- Updater: when Release channel has no packages, fall back to beta so the client
  is not stuck with "no updates" while Release is empty on the API
- Updater: compare build timestamps so same-semver rebuilds still offer an update
* Updater: prefer NSIS Setup (GreenTeaSpeak2-Setup-*.exe --updated) for in-app
  updates again; folder-update/robocopy only if Setup is missing from the archive
- Updater: do not robocopy win-unpacked when Setup is present (Setup was skipped)
* App requests administrator rights (UAC) at startup so updates can overwrite
  files without a mid-update elevation surprise (reverted in 2.8.2 — UAC on Setup only)

2.8.0:
- Antiflood: throttle/serialize server icon downloads (max 2 parallel, start gap,
  backoff on temporary FT failures); do not remount-retry 2051/flood errors
* Signed icon path retry on 2051 still applies, with a short delay between forms
- Voice: stop rewarming the full peer roster on every mute/PTT/send sync (was
  logging "rewarmed N … after audio restart" dozens of times per minute); rewarm
  only after a hard audio backend restart, coalesced
- Flood ban (3331): never auto-reconnect on ban/flood; show banned notice; if a
  reconnect is scheduled for other reasons, wait until ban expiry when parsed
- Updater: resolve PowerShell via SystemRoot (packaged PATH), await spawn success
  before exit, shut down voice/sessions before apply, surface start failures to
  the updater window instead of silently quitting

2.7.9:
- Server/group icons: on FT error 2051 (file not found), retry download with the
  int32 signed path form (`/icon_-N`) when the CRC32 id has the high bit set —
  classic TeamSpeak signed-vs-unsigned mismatch; do not cache 2051 until both forms fail
* Icon download warnings now include host, port, path, and error id
- Icon file list accepts signed `icon_-N` names from ftgetfilelist
* ftinitdownload/upload send empty `path=` like the oldclient (name still holds `/icon_…`)

2.7.8:
- Updater/installer branding: shared resolveAppIconPath (resources/logo.ico) for updater BrowserWindow, tray, crash UI, and all windows; ClientUpdaterWindow uses brand/logo-128.png; desktop favicon works with resources/ publicDir; NSIS Setup/uninstall/header + build/icon.ico aligned
- Updater: no visible cmd/Windows Terminal flash while waiting for the client to exit (hidden PowerShell PID wait instead of tasklist|find); no hung blank console on copy failure
- Updater: elevate only when the install folder is not writable (Program Files / machine-wide); per-user installs under %LOCALAPPDATA% update without UAC; clear error if elevation is cancelled
* Installer: NSIS perMachine=false remains the default; elevation stays in AppServices only when the install dir is not writable

2.7.7:
* Updater: one-click happy path (download + apply, no second “Apply update” step); simpler progress copy; channel options moved under Advanced
* Desktop main process respects UI language (tray, native dialogs, window titles, VoIP/crash dialogs, disconnect notices)
- Server/channel/client icons load on servers with a non-default file transfer port (same notifystart* port path as channel files; retry instead of caching FT failures)
- Language setting now updates all windows immediately (main UI / menus), not only the Settings window

2.7.6:
+ UI languages: 10 locales (de, en, nl, pt, hu, es, ru, it, tr, pl) — language setting switches the full interface (menus, settings, dialogs, tray, connection logs)
* Language preference stores a stable locale code; OS language is used on first launch
- Voice: stop thinning peer jitter to 60ms (UI default / first volume edit); use 100ms and ignore live volume ticks on the hot path — cuts intermittent underflow fadeouts ("wolliger" / muffled peer audio)
- Voice: Opus FEC decode flag actually passed to opus_decode_float (was hardcoded 0 in the shipped native tree)
+ File transfer: auto-detect FT TCP port from server notifystart* (uses whatever the server configured — e.g. 30033 / 30303 / custom; last-resort fallback 30303 only if omitted)

2.7.5:
- Voice: enable Opus FEC on decode (was hardcoded off — one lost packet became an audible glitch)
- Voice: large packet-ID gaps (late join / rewarm) resync cleanly instead of "missing 12000 packets"
- Protocol: increment command resend_count (was never increased → endless "Resending 1 packets" for hours)
- Protocol: grow command reassembly buffer 32→128 (reduces underflow drops on long sessions)
- Protocol: match command ACKs by packet id & 0xFFFF (generation-safe)
- Uninstall/reinstall: force-kill "GreenTeaSpeak 2.exe" (tray) on init/install/uninstall so a leftover process cannot stay running after remove or during reinstall

2.7.4:
- Updater: wait for client PID exit before copy; relaunch EXE after update
+ Server group dialog: assignment window with checkboxes (not the permission editor)
- Log filenames use local time instead of UTC (fixes 23:25 names at 01:25)
- Updater: in-app update copies win-unpacked via robocopy (no NSIS) — avoids false "kann nicht geschlossen werden"
- Updater: NSIS CopyFiles quotes install dir (fixes fail on "…\GreenTeaSpeak 2" with no client process); simple RMDir uninstall; no /D= when path has spaces
- Context menu: server group icons show (no Windows checkbox menu type — it hid icons)

2.7.3:
- Soft 3D: hard-block spatial peer volume at native layer (no distance duck / "wool blanket" / sock-in-mouth path)

2.7.2:
+ Updater: client relaunches automatically after update (Finish page skipped)
- Context menu: show server/channel group icons next to group names
* Updater: NSIS update shows file-copy progress window (no longer fully silent)
* Voice: mic capture opens only while transmitting (unmute/PTT/whisper); muted or PTT idle releases the WASAPI device so RadioBoss/exclusive apps can use it

2.7.1:
* Soft 3D / spatial gain fully disabled (kill switch) until muffled-audio investigation is done
- Connect: serialize all connects; replace same-server tab instead of spawning a second session (fixes Sweety/Sweety1 doppel-connect)
- Weblist connect: use selected identity / forum handshake (no anonymous second UID)
- Reconnect: block parallel resume+timer handshakes

2.7.0:
- Fixed: jitter buffer (80ms) was never actually applied due to wrong set order (max must be set before min); this caused constant near-zero buffering and frequent underflow fadeouts ("wool blanket" / muffled sound on peers)
* Update channel: Release channel is now available and selectable in settings

2.6.9:
- Playback no longer resets the jitter buffer on every volume tick (fixes intermittent muffled/"wool blanket" peer audio)
* Soft 3D: clear leftover spatial gains on connect when no plugin owns spatial; UI still does not drive audio

2.6.8:
- Soft 3D no longer ducks other users' volume in normal voice use; spatial gain only applies when a plugin (e.g. SaltyChat) drives it
* Soft 3D dialog: placement preview only; audio stays off until a plugin locks spatial
* Soft 3D persist: do not auto-enable from spatial-3d.json; remap placements by nickname

2.6.7:
+ Plugin runtime: install/enable plugins via Extensions (catalog ZIP or local folder)
+ Soft 3D / spatial voice engine and Extras → 3D Sound dialog (AFK placement)
+ Server Unique ID shown in the info panel and copyable from the context menu
+ Online catalog can download plugins (e.g. SaltyChat) separately from sound packs
* Server license labels: NPG (Non-Profit Gamer), CGL (Community Gamer License), AGHP (Authorized GreenTeaSpeak Host Provider)
- Audio Apply while connected: soft device switch instead of tearing down VoiceClients (no more silent peers until rejoin)
* Plugins are not shipped inside the installer; SDK is for developers only

2.6.6:
* Ship bundled sound packs as real files under resources/soundpacks (extraResources) so updates replace Speech Male/Female stereo WAVs for installed clients

2.6.5:
+ Sound pack catalog preview images are saved locally and shown for installed packs
+ Poke dialog: right-click copy/select-all; links in poke messages are clickable
* Bundled Speech (Male) / Speech (Female) sound packs converted from mono to stereo

2.6.4:
- Favorites: name collisions get (1)/(2) suffixes instead of doubling the label
- UI stays usable on server timeout / reconnect (disconnect, cancel, favorites)

2.6.3:
* Update channel: Beta is the default; Release stays grayed out until UPDATE_RELEASE_CHANNEL_ENABLED is flipped
- Sound pack selection from the online catalog survives restart and updates (hydrate, catalogId, download fixes)
- Mass move: coalesce leave/join/moved sounds (no triple spam; at most one cue after bulk)

2.6.2:
- Suppress whisper error 1804 spam when there are no whisper targets; stop sending on empty targets
+ Faster domain:port connect (skip TSDNS/SRV TCP probes for explicit host:port; DNS/status cache)
* Channel [*spacer…] repetitive spacers match oldclient behavior

2.6.1:
- Incoming whisper audio playback fixed (VOICE_WHISPER receive)
+ Remote whisper talk lamp in channel tree
* Whisper receive notification sound uses short soft shush (pissst) instead of chat ding

2.6.0:
+ Whisper lists with hold hotkeys (PTT-style; VAD ignored while whispering)
+ Whisper settings (Audio → Whisper): incoming rights, sound, history panel
* Whisper receive cue uses short soft shush (whisper_notify), not chat ding
+ Contacts: right-click friend/block, contacts dialog, custom display names
+ Configurable talk-lamp colors for Whisper and Channel Commander
+ Channel description and topic shown in the info panel
+ Undocked channel tree: “fold main window” keeps the tree open (X still quits)
- Fix alien/robot mic pitch on high sample-rate capture devices
- Fix native crash in audio event queue (null weak_ptr on disconnect/exit)
- Whisper no longer spams whisper.list.empty; empty sound removed
- Channel switch no longer plays a barrage of join sounds or false channel-edit sounds
- Duplicate permission error on failed client move removed
* Contacts show as [Custom Name] Nickname (no friend sphere icon)

2.5.9:
+ Light and dark theme support across the client UI
+ Talk lamp: idle state uses a darker color for clearer speaking feedback
+ Events and notifications wiring improved
+ Chat timestamps show the date; chat font size setting applies correctly
+ Screen and camera picker modernized; camera background blur and image options
- File browser no longer shows a duplicate title
- Fix bot:get-settings request handling
- Video UI styling corrected for light mode
* Screen/camera share performance improvements

2.5.8:
+ In-app browser (BrowserView): back/forward/reload; same URL re-opens with hard refresh
- Away-with-message dropdown works again when the info panel is hidden (tree-only layout)
- Channel tree colors: current channel blue, password yellow, full red (was inverted)
- Connect / homepage / weblist: use identity or last nickname instead of the default placeholder
- Push-to-talk: Left and Right Ctrl can be bound separately
- Move sounds no longer play two or three times for one client move
- File transfer finished sounds (upload/download)
- Native voice: auto-register speakers, 80ms jitter default, separate encode/decode threads (multi-speaker quality)
- Sound pack selection from the online catalog persists across updates
* Forum session soft-renew on startup after client updates
* Profiles: identity display name labeled as Nickname for new connections

2.5.7:
- Pack forum public-key.pem into the Windows build (desktop out + resources) so Forum verify finds the key at runtime

2.5.6:
+ Server edit dialog: modern GTS2 layout with sidebar categories (General, Host, …)
+ Permission editor: modern GTS2 shell, sidebar navigation, window-filling layout
+ Group members: add clients via clear modal (DB-ID or Unique ID) instead of cramped inline fields
- Server edit: default groups selectable by name; server nicknames display-only in the dialog
* Permission editor primary actions use GTS2 green styling
- Extra windows no longer show a duplicate inner title bar with a second close button (settings, profiles, server list, server edit, permission editor)

2.5.5:
- Updater: restored setup-installer flow from backup (NSIS setup in update package; client spawns installer and quits)
- Updater: use fast exitForUpdate after spawning NSIS so before-quit shutdown no longer blocks the setup wizard

2.5.4:
- Connect: "Connected" status appears immediately after the channel list loads; roster subscribe runs in the background
- Sound packs: connect chime plays right away (no wait for imported-pack scan); only connection.connected on join (no spurious channel.edited during bootstrap)
- Permission editor: fixed blank window, flickering, and duplicate loading; cache-first group list and stable tab switching
- Updater: dedicated in-place update script replaces app files only (preserves taskbar pins and shortcuts; no NSIS reinstall on auto-update)

2.5.3:
- Updater: apply update exits immediately so the installer or in-place copy can replace locked files (fixes update not starting after apply)
- Sound packs: Web Audio playback with output device routing; Windows ducking policy keeps voice at full volume while sound packs play

2.5.2:
- Audio: remap legacy native device ids (ma-out:/ma-in:) by device name; fall back to default instead of invalid device id on apply
- Microphone settings: native level meter for mic test when using miniaudio (live level bar works again)

2.5.1:
- Sound packs: play via stable HTML audio on the configured output device (Chromium setSinkId with native device name mapping)
- Sound packs: no longer use native playback_sound path (fixes cut-off, stutter, and crash on long sounds)

2.5.0:
+ Channel file browser: context menu for download, rename (F2), and delete
+ Hotkeys: multi-client selection / multi-move hold key is configurable (any key or modifier; default Alt)
- Permission editor: integer/grant fields are editable again; active tab scopes rights (no mixing across tabs)
* Extensions browser UI cleaned up (toolbar, list rows); Themes/Plugins remain disabled for now

2.4.9:
+ Settings → Extensions: browse and download sound packs from greenteaspeak.de (online catalog with install progress)
+ Only Speech sound packs ship with the installer; Kleiner Nils, Military (English), and GTS2 are available via the online catalog
* Themes and Plugins categories are shown but disabled until supported

2.4.8:
+ Bundled sound packs: Speech (Male), Speech (Female), Kleiner Nils (by Struppi), and Military (English)
+ sound packs: GTS event mapping generated from settings.ini (join/move/chat sounds work correctly)
- Sound pack event sounds are suppressed while deaf (speaker off)
- Fix startup crash when loading imported  sound packs (mapping module bundled in main process)

2.4.7:
+ Multi-client move: Ctrl+drag over clients to add to selection; own client can be included and moves with the group
+ Bulk move plays the move sound once instead of once per client
- Channels are no longer included in Ctrl+click or Ctrl+drag multi-selection
- Bundle MSVC runtime DLLs (vcruntime140, msvcp140) so native modules load on PCs without Visual C++ Redist
- Fix connection log language helper import on startup

2.4.6:
+ VoIP blacklist check via license server (SRV/DNS resolve to IPv4, API true/marked/false)
+ Blacklisted servers: warning dialog, red session log entry, connection rejected
+ Marked (suspicious) servers: warning dialog with Continue/Cancel; red log entry
- Blacklist warning shows again on each new connect attempt; no IPC error stack trace on reject
- Server chat tab (server-root) can no longer be closed

2.4.5:
+ File browser: rename files and folders (F2), drag-and-drop upload
+ Move multiple clients at once (Ctrl+click selection, context menu, drag-and-drop)
+ Close any chat tab including channel chats; close all chats from context menu
+ Application language auto-detected from OS on first start; connection log messages in German or English
+ Sound pack changes apply immediately without restarting the client
- Fix duplicate connection log line when a client is moved (single notifyclientmoved entry only)
- Fix avatars not loading or uploading (missing avatarBufferToDataUrl helper)
- Fix default avatar silhouette visible behind a custom avatar image
- Fix parallel connect attempts causing identity-already-online (521) errors on reconnect

2.4.4:
+ Invite friends from Extras menu or server/channel context menu (gts2server link, HTTP redirect, HTML snippet)
+ Portable edition can launch the bundled installer to install GreenTeaSpeak 2 permanently
- Fix portable client using the same user data folder as the installed app (single-instance lock / silent exit)
- Fix client failing to start after portable-install changes (missing AppInfo import)

2.4.3:
+ Status bar news ticker from greenteaspeak.de (scrolling text with pause between cycles; auto-refresh every 30 seconds)
+ Status bar display options (nickname, identity, ping, server address, connection quality) persist across restarts
- Fix selected microphone and output device not restored after restart — preferences saved to disk and merged on startup
- Fix client volume above 100% (+dB) not making other users audibly louder

2.4.2:
- Fix host banner displayed too small above the channel tree (removed 96px height cap; oldclient banner modes restored)
- Fix own talking indicator staying lit permanently with voice activation (VAD) when not speaking

2.4.1:
- Fix talking indicator stuck on after voice activation (VAD) — server talking flag no longer overrides native playback state
- Fix push-to-talk talking indicator flickering off while the key is still held
- Fix no voice after switching headphones/output device — native device matched by saved name, voice clients re-registered after audio restart, output device applies immediately from settings
- Fix private chat tab showing your own nickname instead of the partner when sending messages (consistent pm-uid channel ids)

2.4.0:
+ User info shows client platform next to version (e.g. "2.4.0 on Windows")
- Fix push-to-talk stopping when the window loses focus while the PTT key is still held (background transmission continues on Windows)

2.3.9:
- Fix sound pack and UI sounds playing on the wrong output device (e.g. TV instead of headphones) — route HTML5 audio via setSinkId using device name matching and persisted browser sink ID
- Fix mojibake in connection log / chat system messages (German umlauts and quotes displayed as garbled text)
- Fix forum identity fallback on foreign TeaSpeak servers: when the server rejects the forum handshake, automatically reconnect with the GreenTeaSpeak identity instead of failing with a misleading login error
- Fix forum badges not appearing after switching from forum to normal identity (badges re-synced on connect and tab switch)
- Fix talking indicator (blue glow) showing for clients in other channels — only peers in your own voice channel are highlighted now
+ Channel tree popout window (oldclient-style) with hover button in the channel tree
+ View preferences persist (toolbar, server tabs, status bar, master volume, host banner, info panel)
+ Info panel (right) can be hidden for compact layout; tree stays visible
+ Compact window mode (480px fixed width) when info panel is hidden

2.3.8:
- Fix remaining startup paths that still opened native audio (bootstrap native status, sound-pack output routing)
- Audio settings use browser device list only (no miniaudio in settings); native voice opens on server connect; device names matched by label
+ Audio capture/playback mode like TeamSpeak: Windows Audio Session (WASAPI) or Direct Sound — separate settings for microphone and speaker
- Apply audio backend (WASAPI/Direct Sound) before native miniaudio init on connect — fixes wrong/missing backend when voice clients register
- Native miniaudio: auto-fallback from WASAPI to Direct Sound when a context fails to open
- Fix startup crash on some Windows audio setups: defer native miniaudio (teaclient_connection) until server connect — saved device/volume/VAD prefs still apply at launch
- Defer native miniaudio until first voice playback or mic use — connect no longer opens audio immediately (fixes crash on weak/problematic Windows audio stacks)

2.3.7:
+ Native crash dump reporter (Tea[*]Speak-style): minidump + crash window with dump path on main/renderer crash
+ Dev: `npm run crash-test` triggers a test crash and opens the reporter window

2.3.6:
- Sound pack + UI sounds route to the configured output device (setSinkId), not always system default speakers
- Deafen also mutes the microphone (TeamSpeak-style); undeafen restores mic unless it was muted before

2.3.5:
- Import Tea[*]Speak 3 soundpacks (folder / .zip / .ts3_soundpack with settings.ini) or native GTS2 packs in Settings → Sounds
- Sound Pack as nested submenu under Selbst (Tea[*]Speak-style), with checkmark on active pack
- Drop-in soundpack folders: create/open folder under userData/soundpacks, drop WAVs or settings.ini — auto-detected on refresh
- Favorites: allow multiple bookmarks for the same server address with different names
- Fix Connect dialog: Verbinden waited until after window.close() and never started the connection
- Toolbar: Away → Mute → Deaf → separator → Subscribe → Screen → Camera; Connect / Server list / Disconnect only under Verbinden menu
- Fix Serverliste menu icon (was same as Verbinden; now client-weblist)
- Fix Beenden / Strg+Q / window X: fully quit (no hide-to-tray on close)
- Fix identity import security level (wrong TomCrypt public-key flag showed 0; export now keeps hash-cash offset)
- Fix profile avatar: show uploaded image immediately (preview returned from upload)
- Fix microphone activation threshold at startup: apply saved settings before bootstrap and sync VAD on connect
- Fix Push-to-Talk: no longer auto-mutes when enabling PTT or on startup (idle PTT ≠ muted)

2.3.4:
- Fix global Push-to-Talk in background via WH_KEYBOARD_LL in main (works unfocused/tray; no RIDEV_NOLEGACY freeze)
- Fix PTT when binding is Ctrl/Alt/Shift (map L/R modifier VKs; no GetAsyncKeyState inside hook)
- GetAsyncKeyState 10ms poll backup (Discord-style) if LL hook is starved
- System tray like Tea[*]Speak: X hides to tray; double-click / menu to show; mute, disconnect, quit from tray

2.3.3:
- Fix global Push-to-Talk in background: run teaclient_ppt in an Electron utilityProcess (renderer was throttled when unfocused; main RIDEV_NOLEGACY freezes UI)

2.3.2:
- Local client/bot volume: oldclient-style dB dialog for users; re-apply native VoiceClient volume when clients talk
- Global Push-to-Talk outside the window via teaclient_ppt in preload (not Electron main)
- License badge: only servers with version like `2.5.1 [Build: …]` are GreenTeaSpeak; `TeaSpeak 1.4.x…` shows "Kein GreenTeaSpeak-Server"
- Tidy client context menu: nest Info / Move / Moderation / Audio; shorter labels

2.3.1:
- Wire Sprachlautstärke (and Aufnahmelautstärke) to native playback/capture volume — slider previously only wrote localStorage

2.3.0:
- Push-to-Talk / voice idle no longer sets client mute: not transmitting looks dark (no talk), not muted; real mute stays a separate mic toggle

2.2.9:
- Fix local mute/volume/latency for users and music bots under native voice (settings were only applied to the unused WebAudio path)

2.2.8:
- Fix Push-to-Talk sticking open after release: native send enable/disable race + key-up ignored when modifiers differed; release remutes reliably (hold = talk, release = mute)

2.2.7:
- Fix Push-to-Talk actually transmitting: Space binding was saved as a literal space character and never matched; PTT now works while chat is focused; main-window key path + setPttHeld no longer no-ops

2.2.6:
- Fix complete UI freeze on startup: do not attach teaclient_ppt in the Electron main process (RIDEV_NOLEGACY Raw Input blocked keyboard/mouse for Chromium). Push-to-Talk still works in the focused window (Space by default)

2.2.5:
- Fix Push-to-Talk: wire native teaclient_ppt for global key capture (works while another window has focus), default key Space, stop persisting momentary unmute into audio prefs, sync mic send after connect
- Fix chat parity with oldclient: private chats keyed by unique id (survive reconnect), server chat (targetmode 3) sendable again, send/receive sounds and timestamps aligned
- Selecting a client who leaves the server now switches back to server info instead of polling getconnectioninfo (stops "Fehler (512): invalid clientID" spam)
* License label for hoster tier: "Authorized GreenTeaSpeak Host Provider"

2.2.4:
- Fix "too many clones connected (hwid)" on foreign TeaSpeak servers: every install now has its own hardware id instead of the shared static "gts2-native" (that made every GTS2 user look like the same machine)
- Untagged clientinit rejections are no longer silently swallowed — connect fails immediately with the real server message instead of hanging for 30s
+ Auto-improve identity security level when a server demands a higher level (0x207) and reconnect once

2.2.3:
- Fix joining foreign TeaSpeak servers that silently ignore the forum identity proof (no error, just a 20s timeout): any forum handshake failure now triggers the automatic retry with the GreenTeaSpeak identity
* Forum handshake timeouts reduced from 20s to 8s so the identity fallback kicks in quickly

2.2.2:
+ Client log files for diagnostics: every session writes a log to %APPDATA%/GreenTeaSpeak 2/logs (connection log, protocol/handshake output, errors, system info)
+ Menu entry Extras -> "Client Protokoll" (Ctrl+L) now opens the log folder
* Log housekeeping: keeps the last 10 files, 20 MB cap per file

2.2.1:
- Fix joining foreign TeaSpeak servers while logged into the forum: when a server rejects the forum identity, the client now automatically reconnects once with the GreenTeaSpeak identity (oldclient users had to switch profiles manually)
- Honest error message when a server cannot verify the forum identity (previously a misleading "please re-login to the forum")
- Fix "failed to resolve hostname" on domains that only have an SRV record: SRV lookup timeout raised from 600ms to 3s for slow DNS resolvers
* All visible product wording now says GreenTeaSpeak (identity labels, profile manager, error messages)

2.2.0:
! Third-party server support removed — TeaSpeak/GreenTeaSpeak is the only supported target
- Fix connect failures with normal (non-forum) identities: the TeaSpeak identity handshake now always runs (no legacy clientinit fallback)
+ Native file transfer implemented (raw TCP, oldclient wire protocol) — downloads and uploads work on native connections
+ Server group / channel group icons load again (ftinitdownload now sends seekpos=0 and proto=1 like the oldclient — fixes the "seekpos" parser kick)
+ File transfers use the SRV/DNS-resolved server host (fixes ENOTFOUND on domains without an A record)
+ Host banner sits above the channel tree like the oldclient: full width, aspect-ratio scaling, click opens the hostbanner URL, periodic gfx refresh, no placeholder without a banner
+ Connect dialog is a standalone window: compact by default, "More" reveals advanced settings, window height auto-fits the form
+ MusicBot "Add song" dialog (Enter song URL) replaces the browser prompt
+ MusicBot "Manage bot" opens the Playlist Manage window: name, channel commander, priority speaker, replay mode, max playlist size, delete played songs, song-change notification
+ Playlist Manage permissions tab: view/edit playlist permissions, client-specific permissions via uid/dbid search, list clients with own permissions
+ Saved microphone/audio settings are applied at client start (not only after opening the settings window)
* Icon download failures are logged in the main process console ([icons] ...)

2.1.8:
- Stop repeated "Fehler (256): command not found" spam on servers that do not support optional TeaSpeak commands
* Auto-disable unsupported optional commands per session (`setconnectioninfo`, `requeststreaminfo`) after first "command not found"
- Fix connect-time server kick "Invalid argument (failed to parse seekpos as m (stoull))" on affected TeaSpeak forks by skipping native remote icon file-transfer probes

2.1.7:
+ Settings list native miniaudio devices (voice:get-devices) instead of browser device ids — selections now reach the native voice backend
+ Device selection works before the first connect (standalone native controller) and saved devices are applied when native voice initializes
- Live input device switch: stop → set_device → start recorder cycle (oldclient pattern) — voice send no longer dies after changing the microphone
- "default" / stale device ids resolve to the real OS default device instead of failing silently
* Mic test maps the selected native device to the matching browser device by label

2.1.6:
+ Inline nickname rename in channel tree: click your own selected entry to edit (classic client style)
+ Server log entry when a client changes their nickname ("X changed his nickname from ...")
+ Local permission DB: catalog served from memory/disk snapshot, background refresh (oldclient-fast editor open)
+ Screen/camera share buttons are disabled with tooltip when b_video_screen / b_video_camera is missing
- Fix access violation (0xC0000005) on quit/disconnect: detach native callbacks, grace period before destroying the server connection
+ Main-process package @greentea/native-bridge (loader, NativeProtocolClient, NativeVoiceController)
+ Hardcoded PermissionType enum + group_mapping (1:1 oldclient) in @greentea/ipc-contracts
* Default transport/voice: honeybbq + WebAudio (native spawn_server_connection crashes on Electron 33; opt-in GTS_TRANSPORT=native)
* Native command stream: one notify row per event (fixes multi-user talking/mute/tree status)
* Native voice: register clients on enter, talking from playback state, skip renderer WebAudio
* Runtime diagnostics report real native load status; electron-builder packs native/build → resources/natives
* npm scripts: build-natives, rebuild-natives:clean, verify:native-abi
* Talking indicators in channel tree for all visible clients (oldclient), not only own channel
- Channel tree: subscribe + clientlist before UI "connected" (oldclient cold tree — no fake join trickle)
- Native clientlist: accumulate response rows for execCommandWithResponse
- Screen/camera share: use 1.6 Mbps default (oldclient); 4 Mbps exceeded i_video_max_kbps (2500) → permission 2568 for non-admins
- Updater: Accept-Encoding identity, gzip magic check, clearer errors for zlib "invalid block type"
+ Native GreenTeaSpeak stack: build teaclient_*.node for Electron 33 (ABI 130) with miniaudio/WASAPI voice backend

2.1.5:
* HoneyBBQ: wrap diagnostics and always-ACK path kept (survives packet-id generation wrap with fixed server ACK match)
- Forum renew: use web-api/v1/renew&auth_key (works with fixed forum API)
* Online seit: live duration from client_lastconnected for users

2.1.4:
+ Modern favorites manager: search, grouped fields, connect in footer, Settings-aligned look
+ Modern identity/profiles window: side-by-side layout, status pills, German UI
+ Persist local client volume/mute/latency by unique ID (oldclient parity, per server)
* Keepalive: setconnectioninfo every 5s, whoami every 15s; quieter protocol logs (less audio hitch)
- VoiceSession: only re-apply output device / volume / latency when values change (avoid audio clicks)
- Updater: longer download timeout for large tar.gz (avoid truncated gzip / invalid stored block lengths)
- Fix client connection info all-zeros (concurrent getconnectioninfo notify collector race)
- Fix ~4h–7h disconnect "Packet resend failed": ACK every command by cleartext header id, even when decrypt fails at packet-id wrap
* HoneyBBQ: decrypt failures now logged (id/type/generation) instead of silently dropping the packet
* HoneyBBQ: wrap diagnostics — duplicate command re-delivery and send/recv generation changes logged with timestamps
* HoneyBBQ: receive window half-range (32768), circular isInWindow/isOldPacket, decrypt gen fallback ±4
- Forum identity: auto-renew via auth-key before connect (no hard 48h block while session is valid)
- Forum renew: correct API route (web-api/v1/renew with auth_key) — previous route returned 404, renew never worked

2.1.3:
+ Updater window like oldclient: installed vs latest version, download progress bar and log
+ Kick/Ban reason dialogs (Electron has no window.prompt — Cancel no longer kicks)
+ Modern settings shell: searchable sidebar, page headers, grouped cards, toggle switches
* Slow channel-tree clientlist poll from 10s to 20s to reduce command pressure
- Fix main-process crash ERR_SOCKET_BAD_PORT on UDP send after disconnect (HoneyBBQ safe send + ignore benign socket errors)
- Fix connect timeout: wait for identity-proof ACK before clientinit (TeaSpeak rejects early clientinit with not logged in)
- Clearer handshake errors (forum outdated / proof failed) instead of remapping every timeout to forum login
- Fix TeaSpeak handshake: use return_code so server emits proof ACK before clientinit
- Fix context-menu race dropping Kick/Ban clicks on Windows (defer menu close callback)
- Fix silent UDP blackhole on Node 24/Windows (do not gate sends on missing socket.remotePort)

2.1.2:
+ Music bot: play channel files via ChannelProvider (Add file → file browser picker)
+ File browser: multi-select upload (upload several files in one go)
+ File browser: create folder via inline name field (Electron has no window.prompt)
+ File browser: upload/download progress bar (bytes + percent, multi-file index)
+ File browser opens in its own Electron window (like icon viewer / server list)
+ File browser: multi-select (Ctrl/Shift+click, Ctrl+A) for batch delete / bot playlist add
- Fix finished playlist songs sticking in the UI (handle notifyplaylistsongremove / replace on force reload)
- Fix connection drop "Packet resend failed" after long sessions (ACK wrap-around in GenerationWindow)
* HoneyBBQ patch: treat half-range packet IDs as old duplicates (oldclient parity)

2.1.1:
+ Responsive info panels (container queries) — detail views adapt when the window is not maximized
+ Modern microphone capture settings with TS3-style level meter (−50…+50, live fill, draggable threshold)
* Server tabs: hide tab strip with a single connection; show tabs from the second connection (oldclient)
* Mute system like oldclient: persist mute/deafen, copy state to new tabs, no force-mute on tab switch
- No microphone activated/muted WAV on connect or tab switch — only on explicit user toggle
- Fix music bot playlist not loading (always fetch clientinfo for client_playlist_id in full getBotInfo)
- Fix stale bot "now playing" title for radio streams (sync player_title / refresh live clientinfo)
- Fix command-queue lag from getconnectioninfo pollers (coalesce + cache, gentler UI intervals)
- Fix info panel flashing "Keine Auswahl" while bot/user/channel details are still loading

2.1.0:
+ Redesigned About dialog with Über / Copyright / Lizenz tabs (GreenTeaSpeak Systems branding)
+ Public server list window (Weblist API) with filters, sort, and connect — like the classic client
* Server list runs in its own Electron window; Weblist API is fetched only when that window opens
+ Show disconnect notice dialog when the server forces a leave
- Fix mute / talking / status icons missing after reconnect (e.g. server shutdown)
- Fix music bot talking indicator missing while playing (server talking=0 overwrote voice; sticky player_state)
- Fix music bot subscribe spam after reconnect ("Not running"); defer/retry quietly until protocol is ready
- Answer TeaSpeak notifyconnectioninforequest with setconnectioninfo (same recovery path as oldclient)
- Handle server disconnect immediately on notifyclientleftview (kick/ban/shutdown/timeout), like oldclient
- Fix kick: disconnect tab + show kick reason in log/dialog (was sound-only while staying connected)
- Fix badge configure dialog: equipped badges no longer vanish right after drop (click-after-drop + sync race)
- Fix connection timeout while muted / listening to music bots (extra whoami keepalive every 15s)
* Raise protocol packet idle timeout from 60s to 5 minutes when no UDP is received

2.0.9:
+ Forum badge configure UI (equip slots, redeem codes, team badge always on)
+ Badge changes sync to connected servers via client_badges and refresh the UI live
* Keepalive ping every 1s; resume from sleep probes whoami and reconnects if needed
* Channel edit sends only changed fields (avoids full channeledit permission failures)
- Fix badge dialog hang and connection stalls from awaited clientupdate on badge sync
- Fix connection-info polling spam after disconnect (invalid clientID / UDP not running)
- Stop falling back from SVG badges to leftover old PNG artwork

2.0.8:
+ Kick/ban shows who forced you offline and disconnects that tab (no auto-reconnect)
+ Channel kick notice when moved out of a channel
+ Hide ServerQuery clients (serveradmin) by default; show only with view power when enabled
* Channel tree load waits for channellistfinished and batches updates like the classic client
* Apply notifychannelmoved (parent/order) immediately instead of waiting for a poll
- Fix blank "Edit Virtual Server" window (undefined busy variable crash)

2.0.7:
+ Permission editor layout and categories 1:1 from oldclient (group_mapping)
+ Group icons in the permission editor sidebar
+ Icon picker (Edit / Remove / Add) opens Icon Viewer for groups, channels, and server edit
- Fix concurrent icons:list race ("Icon-Liste abgebrochen")

2.0.6:
+ Deep links (gts2server:// / teaclient://) auto-connect; new tab if already connected
* Forum login always sends forum handshake (status/badges) even with a normal identity selected
* Forum badges announced in clientinit so other clients can see them
- Remove unused "GreenTeaSpeak-ID senden" checkbox from Connect dialog

2.0.5:
+ Open gts2server:// (and teaclient://) deep links — fills Connect dialog with host/port
+ Protocol handler registers on packaged installs (Setup) and launches existing instance
* Invite link copy uses gts2server:// instead of ts3server://

2.0.4:
- Protocol client_version now follows package/app-info (no more hardcoded 2.0.0 Alpha)
- Channel edit loads type/limits/advanced flags from channellist cache like the classic client
- Channel needed file powers use correct i_ft_needed_* permission names
- Treat sql no modifications (1283) as success on channel save
- Server chat tab is log-only (not writable)
- Double-click another client opens client-to-client chat
+ Chat context menu (copy, select all, emoticons, line markers, clear)
+ Emoji picker (emoji-mart) on the chat input
+ Changelog dialog under Help ("Changelog lesen")
+ Modern client / channel / server detail panels
* Host banner keeps aspect ratio and crops at the bottom like Tea(*)Speak
* Music bot playlist UI with context menu (play, copy URL, delete)
* Chat background gray; timestamps on all chat lines including system messages
* Channel-edit sound always plays after a successful local channel save
+ Settings and profile manager as separate non-modal windows (Alt+P / Ctrl+I)

2.0.3:
- Server nicknames: resolve via public directory cache (encrypted local store, ETag refresh)
- Connect shows nickname in UI/log; real host used only internally (DNS prefetched to IP)
- Faster connect path (earlier "connected", post-handshake work in background)
- Voice capture IPC fix (no more invalid transfer / duplicate AudioWorklet errors)
- Play connection.connected on join instead of channel.edited during bootstrap
- DevTools via F12 / Ctrl+Shift+I

2.0.2:
- Away status like the classic client (toolbar toggle, dropdown, away message, tree icon)
- Connect to another server in a new tab (multi-connection tabs)
- Bookmark context menu: Connect, Connect in new tab, Edit favorite
- Cleaner disconnected layout (same proportions as connected, no leftover chat tabs)

2.0.1:
- Hide Query/Template groups unless b_serverinstance_modify_querygroup / modify_templates
- Show server/channel group names in the tree when i_group_show_name_in_tree is Front or Behind
- Editable nickname per bookmark in Favorites manager
- Server "Online since" uses real uptime instead of a placeholder
- Permission editor as separate windows (server/channel groups, channel, client, client-channel)
- Extra permission windows use the darker dialog background (#28282e)

2.0.0:
+ Secure preload IPC with context isolation and sandbox
+ GreenTeaSpeak-style UI with channel tree, context info, event log and channel chat
+ Client updater via clientapi.greenteaspeak.de/gts2/api.php (setup-installer package)
+ Automatic reconnect after timeout or server drop
+ Classic connection log (host/welcome messages) and poke send/receive dialogs
+ Bookmark management, DNS SRV resolution and persistent server banner support
+ Forum identity with RSA verification, voice, whisper and media foundations
+ Server edit window, icon viewer, and improved client/server details
+ First GreenTeaSpeak 2 Windows release (Electron + React + TypeScript)
+ Assisted Windows installer (NSIS) with license acceptance and selectable install directory
